/*
 * jQuery Modal Pro Plugin 1.0
 * https://github.com/danielariza1982
 *
 * Copyright 2013, Daniel Ariza
 * https://danielariza.com
 *
 * Licensed under the MIT license:
 * http://www.opensource.org/licenses/MIT
 */

(function($, undefined) {

	var opciones = {
			
			autoValidate: false,
			passwdClass: '.passwd1',
			passwdClassValidate: '.passwd2',
			borderColorError: '2px solid #CF816A',
			borderColorSuccess: '2px solid #A1BC37', 
			msgValidteUsername: 'El formato correcto es entre 4 y 15  letras y números ', 
			msgValidatePasswd: 'El formato correcto es 6 - 9 letras, 1 mayúscula, 1 minúscula, 1 número y 1 caracter',
			msgPasswdVs: 'Las contraseñas no coinciden',
			msgDateOfBirth: 'El formato correcto es DD/MM/YYYY',
			msgValidateEmail: 'El formato correcto es ex. your@email.com',
			msgValidateTelephone: 'El formato correcto es ex. 123456789',
			msgValidateIdentityCard: 'El formato correcto es ex. 12345678A ó B12345678',
			msgValidatePostalCode: 'El formato correcto es ex. 29862',	
			dataRequired: 'obligatorio', 	
			dataUsername: 'username',
			dataPasswd: 'passwd', 
			dataEmail: 'email', 
			dataTelephone: 'tel',  
			dataIdentityCard: 'nif', 
			dataPostalCode: 'cp', 
			dataDateOfBirth: 'birth', 
			dataCheckBox: 'check', 
			usernameValidation: /^[a-z\d_]{4,15}$/i,
			passwdValidation: /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}$/,
			emailValidation: /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/,
			telephoneValidation: /^[0-9]{2,3}-? ?[0-9]{6,7}$/,
			identityCardValidation: /^(([A-Z]\d{8})|(\d{8}[A-Z]))$/,
			postalCodeValidation: /^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$/,
			dateOfBirth: /^\d{1,2}\/\d{1,2}\/\d{4}$/
			
		}

	jQuery.fn.validationForm = function (options) {
	
		return this.each(function() {
	  
			var config = jQuery.extend({}, opciones, options);
			
			var dataObligatorio = jQuery(this).find('input').data(config.dataRequired),
				el = jQuery(this).find('input[type="text"], input[type="password"], input[type="checkbox"], textarea'),
				checkCheckbox = jQuery(this).find('input[type="checkbox"]'),
				
				usernameValidation = config.usernameValidation,
				passwdValidation = config.passwdValidation,
				msgPasswdVs = config.msgPasswdVs,
				msgDateOfBirth = config.msgDateOfBirth,
				emailValidation = config.emailValidation,
				telephoneValidation = config.telephoneValidation,
				identityCardValidation = config.identityCardValidation,
				postalCodeValidation = config.postalCodeValidation,
				dateOfBirth = config.dateOfBirth; 
			
			// jQuery(this).attr("name") == "cif" && !identityCardValidation.test(jQuery(this).val())
			
			jQuery(this).find('span').hide();
			
			// Añadimos una función que liste los inputs
			
			function checkAll() {
				
				el.each(function(){
					
					if(jQuery(this).data(config.dataRequired) == true && jQuery(this).val() == '' ) {
						
						jQuery(this).css('border', config.borderColorError);
						jQuery(this).next('span').show();
						
						return true;
						
					} else if(jQuery(this).data(config.dataUsername) == true && !usernameValidation.test(jQuery(this).val())) {
					
						jQuery(this).css('border', config.borderColorError);
						jQuery(this).next('span').html(config.msgValidteUsername).show();
						
						return true;
					
					} else if(jQuery(this).data(config.dataPasswd) == true && !passwdValidation.test(jQuery(this).val())) {
					
						jQuery(this).css('border', config.borderColorError);
						jQuery(this).next('span').html(config.msgValidatePasswd).show();
						
						return true;
						
					} else if(jQuery(config.passwdClass).val() != jQuery(config.passwdClassValidate).val() ) {
					
						jQuery(config.passwdClass).css('border', config.borderColorError);
						jQuery(config.passwdClass).next('span').html(config.msgPasswdVs).show();
						jQuery(config.passwdClassValidate).css('border', config.borderColorError);
						jQuery(config.passwdClassValidate).next('span').html(config.msgPasswdVs).show();
						
						return true;
						
					} else if(jQuery(this).data(config.dataDateOfBirth) == true && !dateOfBirth.test(jQuery(this).val())) {
						
						jQuery(this).css('border', config.borderColorError);
						jQuery(this).next('span').html(config.msgDateOfBirth).show();
						
						return true;
						
					} else if(jQuery(this).data(config.dataEmail) == true && !emailValidation.test(jQuery(this).val())) {
					
						jQuery(this).css('border', config.borderColorError);
						jQuery(this).next('span').html(config.msgValidateEmail).show();
						
						return true;
						
					} else if(jQuery(this).data(config.dataTelephone) == true && !telephoneValidation.test(jQuery(this).val())) {
					
						jQuery(this).css('border', config.borderColorError);
						jQuery(this).next('span').html(config.msgValidateTelephone).show();
						
						return true;
						
					} else if(jQuery(this).data(config.dataIdentityCard) == true && !identityCardValidation.test(jQuery(this).val())) {
					
						jQuery(this).css('border', config.borderColorError);
						jQuery(this).next('span').html(config.msgValidateIdentityCard).show();
						
						return true;
						
					} else if(jQuery(this).data(config.dataPostalCode) == true && !postalCodeValidation.test(jQuery(this).val())) {
					
						jQuery(this).css('border', config.borderColorError);
						jQuery(this).next('span').html(config.msgValidatePostalCode).show();
						
						return true;
						
					} else if(jQuery(this).data(config.dataCheckBox) == true && !jQuery(this).is(':checked') ) {
					
						jQuery(this).next('span').show();
						
						return true;
				
					} else {
						
						jQuery(this).css('border', config.borderColorSuccess);
						jQuery(this).next('span').hide();
						
					}
					
				});
				
			}
			
			var valueValidate = false;
			
			function checkValidate() {
				
				el.each(function(){
					
					if(jQuery(this).data(config.dataRequired) == true && jQuery(this).val() == '' ) {
						
						valueValidate = false;
					
					} else if(jQuery(this).data(config.dataUsername) == true && !usernameValidation.test(jQuery(this).val())) {
						
						valueValidate = false;
						
					} else if(jQuery(this).data(config.dataPasswd) == true && !passwdValidation.test(jQuery(this).val())) {
					
						valueValidate = false;
						
					} else if(jQuery(config.passwdClass).val() != jQuery(config.passwdClassValidate).val() ) {
					
						valueValidate = false;
						
					} else if(jQuery(this).data(config.dataDateOfBirth) == true && !dateOfBirth.test(jQuery(this).val())) {
					
						valueValidate = false;
					
					} else if(jQuery(this).data(config.dataEmail) == true && !emailValidation.test(jQuery(this).val())) {
					
						valueValidate = false;
						
					} else if(jQuery(this).data(config.dataTelephone) == true && !telephoneValidation.test(jQuery(this).val())) {
					
						valueValidate = false;
						
					} else if(jQuery(this).data(config.dataIdentityCard) == true && !identityCardValidation.test(jQuery(this).val())) {
					
						valueValidate = false;
					
					} else if(jQuery(this).data(config.dataPostalCode) == true && !postalCodeValidation.test(jQuery(this).val())) {
					
						valueValidate = false;
						
					} else if(jQuery(this).data(config.dataCheckBox) == true && !jQuery(this).is(':checked') ) {
					
						valueValidate = false;
						
					} else {
						
						valueValidate = true;
						
					}
					
					return valueValidate;
					
				});
				
				return valueValidate;
				
			}
			
			function validate(){
			
				checkCheckbox.each(function() {
					
					// jQuery(this).next('span').show();
					
					jQuery(this).click(function(){
						
						if(jQuery(this).data(config.dataCheckBox) == true && !jQuery(this).is(':checked') ) {
					
							jQuery(this).next('span').show();
						
						} else {
							
							jQuery(this).next('span').hide();
							
						}
						
					});
					
				});
				
				el.each(function(){
					
					jQuery(this).focus(function() {
						
						if(jQuery(this).data(config.dataRequired) == true && jQuery(this).val() == '' ) {
							
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').show();
							
						} else if(jQuery(this).data(config.dataUsername) == true && !usernameValidation.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidteUsername).show();
							
						} else if(jQuery(this).data(config.dataPasswd) == true && !passwdValidation.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidatePasswd).show();

						} else if(jQuery(config.passwdClass).val() != jQuery(config.passwdClassValidate).val() ) {
						
							jQuery(config.passwdClass).css('border', config.borderColorError);
							jQuery(config.passwdClass).next('span').html(config.msgPasswdVs).show();
							jQuery(config.passwdClassValidate).css('border', config.borderColorError);
							jQuery(config.passwdClassValidate).next('span').html(config.msgPasswdVs).show();
							
						} else if(jQuery(this).data(config.dataDateOfBirth) == true && !dateOfBirth.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgDateOfBirth).show();
							
						} else if(jQuery(this).data(config.dataEmail) == true && !emailValidation.test(jQuery(this).val())) {
							
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidateEmail).show();
						
						} else if(jQuery(this).data(config.dataTelephone) == true && !telephoneValidation.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidateTelephone).show();
						
						} else if(jQuery(this).data(config.dataIdentityCard) == true && !identityCardValidation.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidateIdentityCard).show();
						
						} else if(jQuery(this).data(config.dataPostalCode) == true && !postalCodeValidation.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidatePostalCode).show();
							
						} else {
							
							jQuery(this).css('border', config.borderColorSuccess);
							jQuery(this).next('span').hide();
							
						}
						
					});
					
					jQuery(this).blur(function() {
						
						if(jQuery(this).data(config.dataRequired) == true && jQuery(this).val() == '' ) {
							
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').show();
						
						} else if(jQuery(this).data(config.dataUsername) == true && !usernameValidation.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidteUsername).show();
							
						} else if(jQuery(this).data(config.dataPasswd) == true && !passwdValidation.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidatePasswd).show();

						} else if(jQuery(config.passwdClass).val() != jQuery(config.passwdClassValidate).val() ) {
						
							jQuery(config.passwdClass).css('border', config.borderColorError);
							jQuery(config.passwdClass).next('span').html(config.msgPasswdVs).show();
							jQuery(config.passwdClassValidate).css('border', config.borderColorError);
							jQuery(config.passwdClassValidate).next('span').html(config.msgPasswdVs).show();
							
						} else if(jQuery(this).data(config.dataDateOfBirth) == true && !dateOfBirth.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgDateOfBirth).show();
							
						} else if(jQuery(this).data(config.dataEmail) == true && !emailValidation.test(jQuery(this).val())) {
							
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidateEmail).show();
							
						} else if(jQuery(this).data(config.dataTelephone) == true && !telephoneValidation.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidateTelephone).show();
						
						} else if(jQuery(this).data(config.dataIdentityCard) == true && !identityCardValidation.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidateIdentityCard).show();
							
						} else if(jQuery(this).data(config.dataPostalCode) == true && !postalCodeValidation.test(jQuery(this).val())) {
					
							jQuery(this).css('border', config.borderColorError);
							jQuery(this).next('span').html(config.msgValidatePostalCode).show();
							
						} else {
							
							jQuery(this).css('border', config.borderColorSuccess);
							jQuery(this).next('span').hide();
							
						}
						
					});
					
				});
				
			};
			
			validate();
			
			// Autovalidate al entrar en la página
			
			if(config.autoValidate === true ) {

				checkAll();
			
			}
			
			jQuery(this).submit(function() {
				
				checkAll();
				
				checkValidate();
				
				console.log(valueValidate);
				
				if(valueValidate == true ) {
				
					return true;
					
				} else {
					
					return false;
					
				}
				
			});
			
		});
	};
	
}(jQuery));